在經過某大神朋友提點之前,對於 interface 有點理解錯誤,也不能說是錯誤,應該是說與 interface 設計初衷不大符合。
理解錯誤的部分就不提了,就直接來談談 interface 設計的最初始用途吧!
它好比一個模板,在其中定義了對像必須實現的成員,通過類別或結構來實現它。
這裡有兩個重點:
由此得知 interface 必須定義一些成員,但卻不能對該成員有實作。
該大神朋友舉的例子我覺得很適合幫助了解,在此分享一下。
若是依照第一段落來理解,先來了小總結。
interface 應該是將一些共用的 function 定義出來等待 class 來實作。
若是依照這個小總結,再回去看 [Day 8],我們就應該要將程式碼再加上 interface重新整理一下。
interface 是要將共用的 function 定義出來等 class 實作。
所以在這個例子來說,應該是要將 Car 的共用 function 定義在 interface 而不是在 class Car,所以應該是要這樣寫。
interface Car {
fun drive()
}
而車子如何開,應該是由 implement 的 class 來實作(決定怎麼開)。
interface Car {
fun drive()
}
class Model3(): Car {
override fun drive() {
//drive by electric
}
}
class RAV4(): Car {
override fun drive() {
//drive by oil
}
}
而在 implement 的 class 就必須實作在 interface 定義的 function , model3 是電能車 RAV4 是油車,所以在創立這兩個 class 時必須對 drive 做不同的實作。
而兩個 class 定義完後,後續利用這兩個 class 實例化出來的物件便會擁有不同的 drive 實作。
最後再舉個不同的例子加深印象。
//這個例子是用遊戲腳色來作為例子
//interface 要定義一些所有腳色共有的 fcuntion
interface BasicFunction {
var position: Int
fun walk()
fun attack(enemyHP: Int): Int
}
//class implement interface 來實作該function
class Warrior() {
//戰士類有一起始位置為 0
override var position = 0
//戰士類有一 function walk 可以改變起始位置
override fun walk() {
position += 1
}
//戰士類有一 function attack ,需有一參數 敵人的血量傳入,並且會依照傳入值 - 10回傳
override fun attack(enemyHP: Int): Int {
return enemyHP - 10
}
}
//宣告一戰士-亞拉岡,此戰士擁有 Warrior 所有實作
val Aragorn = Warrior()